package com.lims.数据库;


import com.lims.utils.FileUtil;

import java.io.File;
import java.util.List;
import java.util.Map;

/**
 * @author limaosheng
 * @create 2022-06-01 16:48
 * @desc
 */
public class 生成表结构MD文档 {


    public static final String DB_NAME = "test";

    /**
     * 生成的md文档可以用typora打开，转成其它格式的文档（html，word）
     * 转成word文档需要安装插件pandoc，才能保证表格格式无误
     * word文档直接上传到腾讯文档，转成在线文档即可
     *
     * Test.java中修改数据库链接
     * Pro.java修改生产数据库链接
     *
     * 新增数据库需要修改函数DbUtil.getConn，
     * 然后main函数增加一个调用
     * @param args
     */
    public static void main(String[] args) {
        gen(DB_NAME,"智能音柱服务数据库设计");
    }

    /**
     * 文档通用部分
     */
    static final String COMM = "修订记录\n" +
            "\n" +
            "版本|修订内容|修订人|修订时间\n" +
            "---|---|---|--- \n" +
            "1.1.1|数据库设计文档自动生成|XXX|2022-06-01\n" +
            "\n" +
            "## 表设计\n";

    public static void gen(String dbName, String fileName){
        fileName = fileName + "(" + dbName + ")";
        StringBuffer sb = new StringBuffer();
        sb.append("# " + fileName + "\n");
        sb.append(COMM);
        //获取所有表
        List<Map<String, Object>> tables = 数据库查询.getAllTables(dbName);
        int i = 1;
        for(Map<String, Object> table : tables){
            String tableName = table.get("TABLE_NAME").toString();
            List<Map<String, Object>> conlumns = 数据库查询.getConlumn(dbName,tableName);
            String tableComment = "表注解";
            //获取表ID注解
            for (Map<String, Object> co : conlumns) {
                String column_name = co.get("COLUMN_NAME").toString();
                if ("id".equals(column_name)) {
                    String column_comment = co.get("COLUMN_COMMENT").toString();
                    if (column_comment.contains("主键")) {
                        tableComment = column_comment.replaceAll("主键", "");
                    }else{
                        tableComment = column_comment;
                    }
                }
            }
            //拼接
            tableComment = tableComment.trim();
            tableComment = tableComment.replace("\n","");
            sb.append("### " +i + "、" + tableComment + "(" + tableName + ") \n");
            i++;
            sb.append("字段 |  类型(长度) |  可空 | 描述\n");
            sb.append("---|---|--- |--- \n");
            for (Map<String, Object> map : conlumns) {
                String column_name = map.get("COLUMN_NAME").toString();
                String column_comment = map.get("COLUMN_COMMENT").toString().trim();//备注
                String is_nullable = map.get("IS_NULLABLE").toString();//是否可为空{NO,YES}
                String column_type = map.get("COLUMN_TYPE").toString();//带长度类型，目前：int(11)，varchar(30)，datetime，date，decimal(12,2)
                String data_type = map.get("DATA_TYPE").toString();//不带长度，与column_type相比，没用括号以及括号内长度
                //String character_maximum_length = map.get("character_maximum_length").toString();//长度，只有varchar有值
                String column_key = map.get("COLUMN_KEY").toString();//主键或者索引，PRI主键，MUL索引
                column_comment = column_comment.replace("\n","");
                if(column_type.contains("unsigned")){
                    column_type = column_type.replace("unsigned","");
                }
                column_type = column_type.trim();
                sb.append(column_name + "|"+column_type+"|"+is_nullable+"|" + column_comment + "\n");
            }
        }

        try {
            String path = System.getProperty("user.dir") + "/doc";
            File file = new File(path);
            if (!file.exists()) {
                file.mkdirs();
            }
            String resPath = path + "/" + fileName + ".md";
            System.out.println("文件地址：" + resPath);
            FileUtil.write(resPath, sb.toString());
        } catch (Exception e) {
            System.out.println("生成失败");
        }
    }
}
